package model;

import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import javax.swing.Timer;
import view.FieldPanel;
import view.GameFrame;
import view.LevelSelectionFrame;

/**
 * Game is de klasse die nodig is voor het spelen van het spel. Game houdt de
 * timer, het level bij ook heefd hij kennis van GameFrame en FieldPanel. Game
 * gebruikt Levelinterpreter om een speelbaar level uit een LevelSpecificatie te
 * halen. Game kan Part observeren om bijv. te hertekennen of het spel te
 * stoppen.
 */
public class Game implements Observer {

    private ArrayList<Field> level;
    private FieldPanel fieldPanel;
    private GameFrame gameFrame;
    private Timer timer;

    public Game(FieldPanel fieldPanel, GameFrame gameFrame) {
        this.gameFrame = gameFrame;
        this.fieldPanel = fieldPanel;
    }

    /**
     * Initialiseert een level.
     */
    public void initLevel(LevelSpecification levelSpecification) {
        LevelInterpreter levelInterpreter = new LevelInterpreter(levelSpecification);
        this.level = levelInterpreter.Interpreter(this, this.gameFrame);
        this.timer = levelInterpreter.getTimer();
        this.draw();
    }

    /*
     * Tekent het speel veld
     */
    private void draw() {
        this.fieldPanel.draw(level);
    }

    public void start() {
        this.timer.start();
    }

    public void stop() {
        this.timer.stop();
    }

    public void pauze() {
        this.timer.stop();
    }

    /**
     * Vangt de eindcondities af van het level af.
     */
    @Override
    public void update(Observable o, Object arg) {

        switch ((Part.ActionPreformed) arg) {
            case PLAYERTERMINATED:
                this.draw();
                this.stop();
                this.gameFrame.messageDialog("U heeft verloren!");
                this.gameFrame.dispose();
                new LevelSelectionFrame().setVisible(true);
                break;
            case CONTAINED:
                this.draw();
                this.stop();
                this.gameFrame.messageDialog("U heeft gewonnen!");
                this.gameFrame.dispose();
                new LevelSelectionFrame().setVisible(true);
                break;
            case MOVED:
                this.draw();
                break;
            case NOACTION:
                break;
        }
    }
}
